package org.lodder.subtools.multisubdownloader.framework; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.prefs.Preferences; import org.lodder.subtools.multisubdownloader.framework.service.providers.ServiceProvider; import org.lodder.subtools.multisubdownloader.framework.service.providers.ServiceProviderComparator; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.Manager; import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Bootstrapper { private static final Logger LOGGER = LoggerFactory.getLogger(Bootstrapper.class); private final Container app; private final Settings settings; private final Preferences preferences; private final Manager manager; public Bootstrapper(Container app, Settings settings, Preferences preferences, Manager manager) { this.app = app; this.settings = settings; this.preferences = preferences; this.manager = manager; } public void initialize() { /* Bind Settings to IoC Container */ this.app.bind("Settings", new Resolver() { @Override public Object resolve() { return settings; } }); /* Bind Preferences to IoC Container */ this.app.bind("Preferences", new Resolver() { @Override public Object resolve() { return preferences; } }); /* Bind Manager to IoC Container */ this.app.bind("Manager", new Resolver() { @Override public Object resolve() { return manager; } }); // Collect ServiceProviders List<ServiceProvider> providers = this.getProviders(); // Sort according to priority Collections.sort(providers, new ServiceProviderComparator()); // Register ServiceProviders this.registerProviders(providers); } @SuppressWarnings({"rawtypes", "unchecked"}) public List<ServiceProvider> getProviders() { Reflections reflections = new Reflections("org.lodder.subtools.multisubdownloader"); Set<Class<? extends ServiceProvider>> providerClasses = reflections.getSubTypesOf(ServiceProvider.class); List<ServiceProvider> providers = new ArrayList<>(); // Intantieer alle serviceproviders for (Class serviceProviderClass : providerClasses) { ServiceProvider serviceProvider = null; try { Constructor constructor = serviceProviderClass.getConstructor(); serviceProvider = (ServiceProvider) constructor.newInstance(); } catch (Exception e) { LOGGER.error("ServiceProvider: '{}' failed to create instance.", serviceProviderClass .getClass().getName()); } if (serviceProvider == null) continue; providers.add(serviceProvider); } return providers; } public void registerProviders(List<ServiceProvider> providers) { // Register serviceproviders for (ServiceProvider provider : providers) { provider.register(this.app); LOGGER.debug("ServiceProvider: '{}' registered.", provider.getClass().getName()); } } }